package noticias.fcf.cat;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.apache.commons.lang3.StringUtils;
import org.jsoup.Jsoup;
import org.w3c.dom.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

import fcf.cat.Config;
import fcf.cat.DBase;
import fcf.cat.Querys;
import fcf.cat.Utils;

public class Noticias {
	
	/**
	* 
	* @throws IOException
	* @throws SQLException
	*/
	public static void init() throws IOException, SQLException{
		//getImagenesNovanetNoticias(); //descarga todas las imagenes desde el servidor de novanet de cada una de las imagenes de portada de cada noticia
		//crearTablasNoticias(); //crea la tabla noticias en fcf_admin copiandola desde la base de datos de novanet, modifica campos de la tabla 
		//urlAmigableNoticias(); //modifica el campo NOTICIA_URL de la tabla fcf_admin.noticias 
		//crearXMLNoticias();
	}
	
	/**
	* 
	*/
	public static void crearTablasNoticias(){
		crearNuevaTablaNoticias();
		crearNuevaTablaNoticiasCuerpo();
	}
	
	/**
	* Funcion que modifica el campo NOTICIA_URL de la tabla noticias
	* @throws SQLException
	*/
	private static void urlAmigableNoticias() throws SQLException{

		ResultSet noticias = DBase.select(Config.BD_ADMIN,Querys.urlAmigablesNoticias());
		
		try {
			
			Connection conn = DBase.connect(Config.BD_SERVER_NODB+Config.BD_ADMIN,Config.BD_USER,Config.BD_PASS);
			
			int ok = 0;
			int error = 0;
			while ( noticias.next() ) { 
			
				String noticia_url = Jsoup.parse(noticias.getString("titulo")).text();
				noticia_url = Utils.validarString(noticia_url);

				boolean res = DBase.multi_query(conn,"fcf_admin","UPDATE noticias SET NOTICIA_URL = '"+noticia_url+"' WHERE COD_NOTICIA = "+noticias.getString("COD_NOTICIA")+";");
				if(res == true){
					System.out.println("Noticia ->"+noticias.getString("COD_NOTICIA")+" modificada correctamente :"+noticia_url);
					ok++;
				}else{
					System.out.println("Noticia ->"+noticias.getString("COD_NOTICIA")+" modificada correctamente");
					error++;
				}
			}
			
			Utils.linea("MODIFICACION CAMPO NOTICIA_URL FINALIZADO");
			Utils.linea("NOTICIAS MODIFICADAS CORRECTAMENTE ->"+ok);
			Utils.linea("NOTICIAS NO MODIFICADAS ->"+error);

		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	/**
	* 
	*/
	public static void getImagenesNovanetNoticias(){
		ResultSet noticias = DBase.select(Config.BD_ADMIN,Querys.getImagenesNoticias());
		try {
			
			int ok = 0;
			int error = 0;
			
			while ( noticias.next() ) { 
			
				String cod_noticia = Jsoup.parse(noticias.getString("COD_NOTICIA")).text();
				String noticia_url = Jsoup.parse(noticias.getString("IMAGEHOME")).text();
				boolean res = saveImage(cod_noticia,noticia_url);

				if(res == true){
					Utils.linea("Noticia :"+noticias.getString("COD_NOTICIA")+"-> imagen descargada correctamente => "+noticia_url);
					ok++;
				}else{
					if(StringUtils.isEmpty(noticia_url)){
						Utils.linea("ERROR :"+noticias.getString("COD_NOTICIA") +"-> ERROR al descargar => CAMPO VACIO");
					}else{
						Utils.linea("ERROR :"+noticias.getString("COD_NOTICIA") +"-> ERROR al descargar");
					}
					error++;
				} 
			}
			
			Utils.linea("FIN DESCARGA IMAGENES PORTADA NOTICIAS");
			Utils.linea("IMAGENES DESCARGADAS :"+ok);
			Utils.linea("IMAGENES NO DESCARGADAS :"+error);
			Utils.nuevaLinea();
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	
	/**
	* 
	* @param cod_noticia
	* @param imageUrl
	* @return
	*/
	public static boolean saveImage(String cod_noticia,String imageUrl) {
			
			if( StringUtils.isNotBlank(imageUrl) ){
				//System.out.println(imageUrl);
				String encodedURL = "http://www.fcf.cat/pnfg/pimg/GestorContenidos/00100_000"+cod_noticia+"_2_"+imageUrl.replace(" ", "%20");
				//System.out.println(encodedURL);
				//String encodedURL = imageUrl.replace(" ", "%20");
				
				try {
					URL url;
					url = new URL(encodedURL);
					System.out.println(url);
					
					InputStream is = url.openStream();
					
					OutputStream os = new FileOutputStream(Config.FOLDER_FOTOS_NOTICIAS+imageUrl);
					byte[] b = new byte[2048];
					int length;

					while ((length = is.read(b)) != -1) {
						os.write(b, 0, length);
					}
					is.close();
					os.close(); 
					return true;
				} catch (MalformedURLException e) {
					e.printStackTrace();
					return false;
				} catch (IOException e) {
					e.printStackTrace();
					return false;
				}
				
			}

			return false;
	
	}
	
	/**
	* Copia la tabla de noticias original de novanet a una nueva tabla
	* Añadimos campos nuevos a la tabla
	* @throws SQLException 
	*/
	public static void crearNuevaTablaNoticias(){
		//ALTER TABLE `fcf_admin`.`test` ADD COLUMN `mario` CHAR(255) NULL AFTER `titulo`; 
		copiarTablaNoticias(Config.BD_FFCATALUNYA,Config.TABLA_NOTICIAS,Config.BD_ADMIN,Config.TABLA_NOTICIAS,Config.TABLA_NOTICIAS_BACKUP);
		modificarTablaNoticias();
			
	}
		
	/**
	* Copia la tabla de noticias original de novanet a una nueva tabla
	* @throws SQLException 
	*/
	public static void crearNuevaTablaNoticiasCuerpo(){
		//ALTER TABLE `fcf_admin`.`test` ADD COLUMN `mario` CHAR(255) NULL AFTER `titulo`; 
		copiarTablaNoticias(Config.BD_FFCATALUNYA,Config.TABLA_NOTICIAS_CUERPO,Config.BD_ADMIN,Config.TABLA_NOTICIAS_CUERPO,Config.TABLA_NOTICIAS_CUERPO_BACKUP);
	}	
	
	/**
	* 
	*/
	public static void modificarTablaNoticias(){
		Utils.linea("INICIANDO MODIFICACION CAMPOS TABLA NOTICIAS");
		DBase.query(Config.BD_ADMIN,"ALTER TABLE noticias DROP COLUMN `FECHA_CADUCIDAD`; ");
		DBase.query(Config.BD_ADMIN,"ALTER TABLE noticias ADD COLUMN `IDIOMA` TINYINT(1) NULL DEFAULT '1' AFTER `COD_PORTAL`; ");
		DBase.query(Config.BD_ADMIN,"ALTER TABLE noticias ADD COLUMN `ELIMINADA` TINYINT(1) NULL DEFAULT '0' AFTER `CODIGO_FOTO`; ");
		DBase.query(Config.BD_ADMIN,"ALTER TABLE noticias ADD COLUMN `VIDEO` TINYINT(1) NULL AFTER `ELIMINADA`; ");
		DBase.query(Config.BD_ADMIN,"ALTER TABLE noticias ADD COLUMN `VIDEO_NOTICIA` CHAR(75) NULL AFTER `VIDEO`; ");
		DBase.query(Config.BD_ADMIN,"ALTER TABLE noticias ADD COLUMN `GALERIA_ASOCIADA` SMALLINT(6) NULL AFTER `VIDEO_NOTICIA`; ");
		DBase.query(Config.BD_ADMIN,"ALTER TABLE noticias ADD COLUMN `FECHA_PUBLICACION` DATETIME NULL AFTER `GALERIA_ASOCIADA`; ");
		DBase.query(Config.BD_ADMIN,"ALTER TABLE noticias ADD COLUMN `FECHA_CADUCIDAD` DATETIME NULL AFTER `FECHA_PUBLICACION`; ");
		DBase.query(Config.BD_ADMIN,"ALTER TABLE noticias ADD COLUMN `CATEGORIA` SMALLINT(6) NULL AFTER `FECHA_CADUCIDAD`; ");
		DBase.query(Config.BD_ADMIN,"ALTER TABLE noticias ADD COLUMN `DOCUMENTOS` CHAR(250) NULL AFTER `CATEGORIA`; ");
		DBase.query(Config.BD_ADMIN,"ALTER TABLE noticias ADD COLUMN `NOTICIA_URL` CHAR(200) NULL AFTER `DOCUMENTOS`; ");
		DBase.query(Config.BD_ADMIN,"ALTER TABLE noticias CHANGE `COD_NOTICIA` `COD_NOTICIA` INT(10) NOT NULL AUTO_INCREMENT; ");
		Utils.linea("FIN MODIFICACION CAMPOS TABLA NOTICIAS");
	}
	
	/**
	* 
	* @param DB_origen
	* @param tabla_origen
	* @param DB_dest
	* @param tabla_dest
	* @param backup
	*/
	public static void copiarTablaNoticias(String DB_origen,String tabla_origen,String DB_dest,String tabla_dest,String backup){
		
		try {
			if(DBase.existeTabla(DB_origen,tabla_origen)){ //Comprueba Si existe la tabla que queremos copiar
				
				if(DBase.existeTabla(DB_dest,backup)){ //Si existe la tabla backup de noticias la eliminamos y la creamos de nuevo
						DBase.deleteBD(DB_dest,backup);//Borramos la tabla para crear nueva
				}
		
				if(DBase.existeTabla(DB_dest,tabla_dest)){ //Si no existe la tabla noticias en la base datos FCF_ADMIN
					DBase.copiarEstructuraTabla(DB_dest,tabla_dest,DB_dest,backup); //copiamos tabla en la BBDD destino a su backup
					DBase.copiarDatosTabla(DB_dest,tabla_dest,DB_dest,backup); //copiamos datos de la BBDD destino a su backup
					DBase.deleteBD(DB_dest,tabla_dest);//Borramos la tabla en destino para crear nueva
				}	

				DBase.copiarEstructuraTabla(DB_origen,tabla_origen,DB_dest,tabla_dest); //copiamos estructura tabla noticias a una nueva tabla 
				DBase.copiarDatosTabla(DB_origen,tabla_origen,DB_dest,tabla_dest); //copiamos datos de la tabla recibida

			}else{
				Utils.linea("TABLA "+DB_origen+"."+tabla_origen+" NO EXISTE");
			}
				
		} catch (SQLException e) {
				
		}
	}
	
	
	public static void crearXMLNoticias(){
		
		ResultSet noticias = DBase.select(Config.BD_ADMIN,"SELECT * FROM noticias WHERE ELIMINADA=0 AND PUBLICADA=1 ORDER BY FECHA DESC LIMIT 20");
		
		try {
			
			while ( noticias.next() ) { 
			
				String cod_noticia = Jsoup.parse(noticias.getString("COD_NOTICIA")).text();
				crearXml();
				System.out.println(cod_noticia);
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public static void crearXml() {
		 
		  try {
	 
			DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
			DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
	 
			// root elements
			Document doc = docBuilder.newDocument();
			Element rootElement = doc.createElement("company");
			doc.appendChild(rootElement);
	 
			// staff elements
			Element staff = doc.createElement("Staff");
			rootElement.appendChild(staff);
	 
			// set attribute to staff element
			Attr attr = doc.createAttribute("id");
			attr.setValue("1");
			staff.setAttributeNode(attr);
	 
			// shorten way
			// staff.setAttribute("id", "1");
	 
			// firstname elements
			Element firstname = doc.createElement("firstname");
			firstname.appendChild(doc.createTextNode("yong"));
			staff.appendChild(firstname);
	 
			// lastname elements
			Element lastname = doc.createElement("lastname");
			lastname.appendChild(doc.createTextNode("mook kim"));
			staff.appendChild(lastname);
	 
			// nickname elements
			Element nickname = doc.createElement("nickname");
			nickname.appendChild(doc.createTextNode("mkyong"));
			staff.appendChild(nickname);
	 
			// salary elements
			Element salary = doc.createElement("salary");
			salary.appendChild(doc.createTextNode("100000"));
			staff.appendChild(salary);
	 
			// write the content into xml file
			TransformerFactory transformerFactory = TransformerFactory.newInstance();
			Transformer transformer = transformerFactory.newTransformer();
			DOMSource source = new DOMSource(doc);
			//StreamResult result = new StreamResult(new File("D://file.xml"));
			StreamResult result =  new StreamResult(System.out);
			// Output to console for testing
			// StreamResult result = new StreamResult(System.out);
	 
			transformer.transform(source, result);
	 
			System.out.println("File saved!");
	 
		  } catch (ParserConfigurationException pce) {
			pce.printStackTrace();
		  } catch (TransformerException tfe) {
			tfe.printStackTrace();
		  }
	}
		
}